iT邦幫忙

2024 iThome 鐵人賽

DAY 18
0
Python

一起來用 Snakify 練練手系列 第 18

【一起來用 Snakify 練練手】Day18 Lesson 8 概念

  • 分享至 

  • xImage
  •  

函數(Functions)與遞迴(Recursion)

在 Python 中,函數是一種將代碼組織起來並重複使用的方式。遞迴則是一種特殊的函數調用方式,允許函數自己調用自己來解決問題。這篇文章將介紹函數、區域與全域變數,以及遞迴。

1. 函數(Functions)

函數是可以重複使用的代碼塊,用來執行某些操作或返回結果。使用函數可以提高代碼的可讀性和可維護性。

1.1 定義函數

在 Python 中,函數使用 def 關鍵字來定義。函數可以接受參數,並且可以返回值。

範例:

def greet(name):
    return f"Hello, {name}!"

這個函數名為 greet,接受一個參數 name,並返回一個格式化的字串。可以這樣調用它:

message = greet("Alice")
print(message)  # 輸出:Hello, Alice!

1.2 函數參數與返回值

函數可以接受多個參數,並且可以根據需要返回一個或多個值。

範例:

def add(a, b):
    return a + b

這個函數接受兩個參數 ab,返回它們的和。使用範例:

result = add(3, 5)
print(result)  # 輸出:8

1.3 預設參數值

函數還可以為參數設置預設值,當調用函數時,如果沒有傳入對應的參數,則使用預設值。

範例:

def greet(name="Guest"):
    return f"Hello, {name}!"

這裡 name 的預設值是 "Guest",如果沒有提供參數,則輸出為:

print(greet())  # 輸出:Hello, Guest!

2. 區域變數與全域變數(Local and Global Variables)

在 Python 中,變數的作用範圍決定了它能在哪些地方被訪問。變數的作用範圍可以分為兩種類型:區域變數和全域變數。

2.1 區域變數(Local Variables)

區域變數是在函數內部定義的變數,作用範圍僅限於函數內部。當函數執行完畢後,區域變數會被銷毀,無法在函數外部使用。

範例:

def my_function():
    x = 10  # x 是區域變數
    print(x)

my_function()  # 輸出:10
# print(x)  # 這會產生錯誤,因為 x 是區域變數,函數外部無法訪問

2.2 全域變數(Global Variables)

全域變數是在函數外部定義的變數,可以在程式的任何地方訪問。若要在函數內部修改全域變數,則需要使用 global 關鍵字。

範例:

x = 10  # 全域變數

def my_function():
    global x
    x = 20  # 修改全域變數
    print(x)

my_function()  # 輸出:20
print(x)  # 輸出:20,因為全域變數已被修改

在這裡,我們使用 global 關鍵字來告訴 Python,函數內部的 x 是全域變數。

3. 遞迴(Recursion)

遞迴是一種特殊的函數調用方式,指的是函數自己調用自己。通常遞迴用來解決問題的子問題,例如分解大的問題為較小的相似問題。使用遞迴時,必須設置停止條件,否則會陷入無限遞迴。

3.1 遞迴的基本結構

遞迴函數的基本結構包含兩部分:

  1. 基本情況(Base Case):用來終止遞迴,防止無限循環。
  2. 遞迴情況(Recursive Case):函數調用自身,解決較小的子問題。

範例:計算階乘(n!

def factorial(n):
    if n == 1:  # 基本情況
        return 1
    else:
        return n * factorial(n - 1)  # 遞迴調用

這個遞迴函數計算一個數字的階乘。階乘的定義為 n! = n * (n-1) * (n-2) * ... * 1,且 1! = 1 是終止條件。

範例調用:

result = factorial(5)
print(result)  # 輸出:120

在這裡,factorial(5) 會調用 factorial(4),然後調用 factorial(3),直到 factorial(1),此時返回 1,然後返回結果依次相乘。

3.2 遞迴的優缺點

優點

  • 遞迴可以將複雜問題拆解為相同類型的子問題,讓代碼更簡潔易懂。

缺點

  • 遞迴的效率通常比迴圈低,因為每次函數調用都需要額外的內存來儲存狀態。如果遞迴過深,可能會導致「堆疊溢位」。

4. 遞迴範例:斐波那契數列

斐波那契數列是一個經典的遞迴範例,其定義為:

F(0) = 0, F(1) = 1
F(n) = F(n-1) + F(n-2)

範例:

def fibonacci(n):
    if n == 0:
        return 0
    elif n == 1:
        return 1
    else:
        return fibonacci(n-1) + fibonacci(n-2)

範例調用:

print(fibonacci(6))  # 輸出:8

這個遞迴函數會計算第 n 個斐波那契數,其中 fibonacci(6) 會依次調用 fibonacci(5)fibonacci(4),直到計算出最終結果。

5. 總結

函數在程式設計中提供了重用代碼的能力,並通過局部與全域變數的區分來控制變數的範圍。遞迴是一種強大的工具,可以用來解決那些可以分解為子問題的複雜問題。雖然遞迴可以簡化代碼,但必須謹慎使用,以防止效能問題和無限遞迴的發生。


上一篇
【一起來用 Snakify 練練手】Day17 Lesson 7 練習題參考解答
下一篇
【一起來用 Snakify 練練手】Day19 Lesson 8 練習題參考解答
系列文
一起來用 Snakify 練練手30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言